/*
 * @Author: jack-ZM
 * @Date: 2022-08-10 14:37:48
 * @LastEditors: jack-ZM
 * @LastEditTime: 2022-08-10 18:53:58
 * @FilePath: /vue3ts-admin-template/src/service/http.ts
 * @Description:分别封装不同 get post 请求
 *
 * Copyright (c) 2022 by zsm smzhang@fiberhome.com, All Rights Reserved.
 */
import qs from 'qs';
import HttpRequest from './index';
import type { RequestInterceptors } from './request/types';
/**
 * @description: 封装get请求 默认请求头为application/json
 * @param {*} D 请求参数的接口类型
 * @param {*} T 返回数据的接口类型
 * @param {*} url 请求url
 * @param {*} data？ 请求数据 （可选参数）
 * @param {*} interceptors 拦截器
 * @return {*} 返回请求后的数据
 */
const get = <T = any>(url: string, data?: any, interceptors?: RequestInterceptors<T>) => {
    return HttpRequest<T>({
        url,
        method: 'GET',
        params: data,
        interceptors
    });
};
/**
 * @description:封装post请求 默认请求头为application/json
 * @param {*} url 请求url
 * @param {*} data？ 请求数据 （可选参数）
 * @param {*} interceptors 拦截器
 * @return {*} 返回请求后的数据
 */
export const post = <T = any>(url: string, data?: any, interceptors?: RequestInterceptors<T>) => {
    return HttpRequest<T>({
        url,
        method: 'POST',
        data,
        interceptors
    });
};

/**
 * @description:封装post请求 请求头为application/x-www-form-urlencoded
 * @param {*} url 请求url
 * @param {*} data 请求数据
 * @param {*} interceptors 拦截器
 * @return {*} 返回请求后的数据
 */
const postFormData = <T = any>(url: string, data: any, interceptors?: RequestInterceptors<T>) => {
    return HttpRequest<T>({
        url,
        method: 'POST',
        data: qs.stringify(data, { arrayFormat: 'repeat' }),
        interceptors
    });
};

/**
 * @description:封装post请求 参数拼接在url上
 * @param {*} url 请求url
 * @param {*} data？ 请求数据 （可选参数）
 * @param {*} interceptors 拦截器
 * @return {*} 返回请求后的数据
 */
const postParams = <T = any>(url: string, data?: any, interceptors?: RequestInterceptors<T>) => {
    return HttpRequest<T>({
        url,
        method: 'POST',
        params: data,
        interceptors
    });
};

export default {
    get,
    postParams,
    post,
    postFormData
};
